<?php

/*
  Definicion del atributo tipo en la tabla Mensajes
  1) invitacion a unirse a un equipo (solamente via mensaje interno)
  2) invitacion a sala (solamente via mensaje interno)
  //3) invitacion a partido(esto no usamos)
  4) invitacion al equipo a unirse a un torneo (via mensaje interno + e-mail)
  5) mensajes comun
  6) invitacion a sala oculto
*/

class MensajesController extends AppController {

	var $name = 'Mensajes';
	var $helpers = array('Html', 'Form', 'Ajax', 'Javascript');
	var $components = array('RequestHandler');
	var $paginate = array(
		'limit' => 1000
	);
	
	function beforeFilter() {
		parent::beforeFilter(); 
		$this->Auth->allowedActions = array('index');
	}
	
	function index() {
		if(!$this->Auth->user()){
                        $this->Session->setFlash(__('Para enviar mensajes privados es necesario loguearse',true));
                        $this->redirect(array('controller' =>'mensajes','action'=>'index'));
                }
			
		$this->Mensaje->recursive = 1;
		
		$this->set('mensajes', $this->paginate());
		
		$this->set('user_id', $this->Auth->user('user'));
			
		/*if($this->params['isAjax']){
			$this->render('mensajes_ajax');
		}*/
		
	}
	
	/*localidad equipo_id
	  destino user_id
	  EL atributo tipo de la tabla Mensaje: 1) invitacion a unirse a un equipo (solamente via mensaje interno)*/
	function addInvitacionesEquipo($equipoId = null){
		
		if(!$equipoId)
			$equipoId = $this->data['Equipo']['equipo'];
			
		$equipo = ClassRegistry::init('Equipo')->find('first', array(
					'conditions' => array(
						'Equipo.equipo ' => $equipoId
					),
					'fields' => array('Equipo.nombre')
		));
			
		$nombreEquipo = $equipo['Equipo']['nombre'];
		
		$this->set('nombreEquipo', $nombreEquipo);
		$this->set('equipoId', $equipoId);
		
		if ( !empty($this->data) ){
				$idDestino = $this->existeUsuarioNombre($this->data['Mensajes']['destino']);
				
				if($idDestino){
					$permiso = $this->invitarUsuarioEquipo($idDestino);
					if(!$permiso){
						$this->Session->setFlash("No se puede invitar a un usuario trial a unirse a un equipo");				
						$this->redirect(array('action'=>'addInvitacionesEquipo/'.$equipoId));
					}
				
					$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
					$this->data['Mensaje']['carpeta'] = 'I';
					$this->data['Mensaje']['destino'] = $idDestino;
					$this->data['Mensaje']['tipo'] = 1; //El tipo 1 es invitacion a unirse a un equipo 
					$link = $this->webroot;
					$this->data['Mensaje']['texto'] = 'Has sido invitado al equipo: '.$nombreEquipo.'<a href='.$link.'equipos/join/'.$equipoId.'> Desea unirse?</a>';
					$this->data['Mensaje']['localidad'] = $equipoId; //la localidad a la que fue invitado
					
					$this->Mensaje->create();
					if ($this->Mensaje->save($this->data)) {
						$this->Session->setFlash("Se ha invitado al usuario ". $this->data['Mensajes']['destino']);
						$this->redirect(array('action'=>'addInvitacionesEquipo/'.$equipoId));
					} else {
						$this->Session->setFlash('El mensaje no se pudo guardar');
						$this->redirect(array('action'=>'addInvitacionesEquipo/'.$equipoId));
					}
				}else{
					$this->Session->setFlash('El nombre de usuario es invalido');
					$this->redirect(array('action'=>'addInvitacionesEquipo/'.$equipoId));				
				}
		}

	}
	
	//Si el usuario es trial no se le puede invitar a un equipo
	function invitarUsuarioEquipo($idUsuario = null){
		
		$user = ClassRegistry::init('User')->find('first', array(
					'conditions' => array(
						'User.user ' => $idUsuario
					),
					'fields' => array('User.grupo_id')
		));
		
		if($user['User']['grupo_id'] < 3)//si es administrador o premum
			return true;
		
		return false;
		
	}
	
	//devuele la lista de los usuatios que cumplen las condiciones para ser invitados al torneo
	function listaUsuariosInvitados($idTorneo = null){
		//obtener todos los equipos
		$equipos = ClassRegistry::init('Equipo')->find('all');
		$invitados = null;
		
		$torneoInvitar = ClassRegistry::init('Torneo')->findByTorneo(
							$idTorneo);
		
		foreach($equipos as $equipo){
			//obtenemos el usuario dueño del equipo
			$user = ClassRegistry::init('User')->findByUser($equipo['Equipo']['user_id']);
			
			if($equipo['Equipo']['torneo_id'] != null){//si el equipo ya pertenece a un torneo
				//obtenemos el torneo al que pertenece el usuario(si exite)
				$torneoUsuario = ClassRegistry::init('Torneo')->findByTorneo(
							$equipo['Equipo']['torneo_id']);
				//y si el torneo al que pertenecen ya esta culminado
				if($torneoUsuario['Torneo']['estado'] >= 9){ 
					//chequeamos si tiene los suficientes puntos como para ser invitado al torneo
					if($user['User']['puntos'] >= $torneoInvitar['Nivel']['puntosminnivel']){
						$invitados[] = $equipo['Equipo']['user_id'];
					}
				}
			}else{//si el equipo no pertenece a un torneo
				//chequeamos si tiene los suficientes puntos como para ser invitado al torneo
				if($user['User']['puntos'] >= $torneoInvitar['Nivel']['puntosminnivel']){					
					$invitados[] = $equipo['Equipo']['user_id'];
				}
			}
			
		}
		
		return $invitados;
		
	}

	//se envian las invitaciones a los torneos via E-mail
	function enviarInvitacionesMail($usuariosInvitar = null){
		
		/*armamos el array de usuarios para luego enviar a la funcion sendMasiveMails*/
		foreach($usuariosInvitar as $idDestino){
			$this->requestAction('/mails/sendSelectiveMails/'.$idDestino);
		}
		
	}
	
	/*localidad torneo_id
	  destino user_id
	  En esta funcion se envian las invitaciones a un torneo especifico*/
	function addInvitacionesTorneo($torneoId = null){

		$torneo = ClassRegistry::init('Torneo')->find('first', array(
					'conditions' => array(
						'Torneo.torneo ' => $torneoId
					)
		));
			
		$nombreTorneo = $torneo['Torneo']['nombre'];
		$torneoId = $torneo['Torneo']['torneo'];
		
		if($torneo){
			
			$usuariosInvitar = $this->listaUsuariosInvitados($torneoId);
			if(!empty($usuariosInvitar)){
				
				foreach( $usuariosInvitar as $idDestino){
					if(!empty($idDestino)){
						$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
						$this->data['Mensaje']['carpeta'] = 'I';
						$this->data['Mensaje']['destino'] = $idDestino;
						$this->data['Mensaje']['tipo'] = 4; //invitacion al equipo a unirse a un torneo
						$link = $this->webroot;
						//$this->data['Mensaje']['texto'] = 'Has sido invitado al torneo: '.$nombreTorneo.'<a href='.$link.'torneos/aceptoTorneo/'.$torneoId.'> Desea unise?</a>';
						$fechaLimite = $this->calcular_fecha($torneo['Torneo']['fechainicio']);

						$this->data['Mensaje']['texto'] = 'Has sido invitado al torneo: '.$nombreTorneo.', la fecha limite de inscripcion es '.$fechaLimite.'<a href='.$link.'torneos/aceptoTorneo/'.$torneoId.'> Desea unirse?</a>';
						$this->data['Mensaje']['localidad'] = $torneoId; //la localidad a la que fue invitado
						
						$this->Mensaje->create();
						if ($this->Mensaje->save($this->data)) {
							//$this->Session->setFlash("Se ha invitado al usuario ". $this->data['Mensajes']['destino']);
							//$this->redirect(array('action'=>'addInvitaciones/'.$salaId));
						} else {
							$this->Session->setFlash('El mensaje no se pudo guardar');
							//$this->redirect(array('action'=>'addInvitaciones/'.$salaId));
						}
					}else{
						$this->Session->setFlash('El nombre de usuario es invalido');
						//$this->redirect(array('action'=>'index'));				
					}
				}
				$this->enviarInvitacionesMail($usuariosInvitar);
			}
		}
		
		/*retornamos la cantidad de usuarios invitados*/
		return count($usuariosInvitar);
	}
	/*Calcula la fecha tope de inscripcion a un torneo*/
	function calcular_fecha($fecha = null){
		list ($añoLimite, $mesLimite, $diaLimite) = split("-", $fecha);
			      
		/*El día limite de inscripcion es 3 días antes del inicio del torneo
		  o el 28 del mes anterior para los casos donde comienza al inicio del mes*/
		if($diaLimite > '3'){
			$diaLimite = $diaLimite - 3;
		}else{
			$diaLimite = 28;
			$mesLimite = $mesLimite - 1;
			if($mes_limite == '0'){
				$mesLimite = 12;
				$añoLimite--;
			}
		}
		$fechaLimite = $añoLimite.'-'.$mesLimite.'-'.$diaLimite;
		
		return $fechaLimite;
		
		
	}
	/*Envia las invitaciones para las salas como mensajes privados*/
	function addInvitaciones($salaId = null){
		
		if(!$salaId)
			$salaId = $this->data['Sala']['sala'];
			
		$sala = ClassRegistry::init('Sala')->find('first', array(
					'conditions' => array(
						'Sala.sala ' => $salaId
					),
					'fields' => array('Sala.nombre')
		));
		
		$nombreSala = $sala['Sala']['nombre'];
		$salaId = $sala['Sala']['sala'];
		
		if (!empty($this->data)) {
			if( $this->existeUsuarioNombre( $this->data['Mensajes']['destino'])){
				$idDestino = $this->existeUsuarioNombre($this->data['Mensajes']['destino']);
				$userGrupoId = ClassRegistry::init('User')->find('first', array(
					'conditions' => array(
						'User.user ' => $idDestino
					),
					'fields' => array('User.grupo_id')
				));

				if($idDestino && $userGrupoId['User']['grupo_id'] != 3){
					$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
					$this->data['Mensaje']['carpeta'] = 'I';
					$this->data['Mensaje']['destino'] = $idDestino;
					$this->data['Mensaje']['tipo'] = 2; //El tipo 2 es tipo invitacion a sala
					$link = $this->webroot;
					$this->data['Mensaje']['texto'] = 'Has sido invitado a la sala: '.$nombreSala.'<a href='.$link.'partidos/index/'.$salaId.'> Desea unirse?</a>';
					$this->data['Mensaje']['localidad'] = $salaId; //la localidad a la que fue invitado
					
					$this->Mensaje->create();
					if ($this->Mensaje->save($this->data)) {
						$this->Session->setFlash("Se ha invitado al usuario ". $this->data['Mensajes']['destino']);
						$this->redirect(array('action'=>'addInvitaciones/'.$salaId));
					} else {
						$this->Session->setFlash('El mensaje no se pudo guardar');
						$this->redirect(array('action'=>'addInvitaciones/'.$salaId));
					}
				}else{
					$this->Session->setFlash('No se puede invitar a un usuario trial');
					//$this->redirect(array('action'=>'index'));				
				}

			}else{
				$this->Session->setFlash('El usuario no existe');
			}
		}
		
		$this->set('nombreSala', $nombreSala);
		$this->set('salaId', $salaId);
	
	}

		
	function view($id = null) {
		if (!$id) {
			$this->flash(__('Invalid Mensaje', true), array('action'=>'index'));
		}
		$this->set('mensaje', $this->Mensaje->read(null, $id));
	}

	function add() {
                if(!$this->Auth->user()){
                        $this->Session->setFlash(__('Para enviar mensajes privados es necesario loguearse', true));
                        $this->redirect(array('controller' =>'mensajes','action'=>'index'));
                }
                /*if($this->Auth->user('grupo_id') > 2){ //Si el usuario es trial 
                        $this->Session->setFlash(__('Solo un usuario Premium o Administrador puede crear nuevas salas', true));
                        $this->redirect(array('controller' =>'salas','action'=>'index'));
                }*/
		//esto ya no hace falta creo
		$users_list = $this->getNombresUsers();
		$this->set('users_list', $users_list);
		
		if (!empty($this->data)) {

			$idDestino = $this->existeUsuarioNombre( $this->data['Mensajes']['destino']);
			
			if($idDestino){
				$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
				$this->data['Mensaje']['carpeta'] = 'E';
				$this->data['Mensaje']['destino'] = $idDestino;
				$this->data['Mensaje']['tipo'] = '5';
				
				$this->Mensaje->create();
				if ($this->Mensaje->save($this->data)) {
					$this->redirect(array('action'=>'index'));
				} else {
					$this->Session->setFlash('El mensaje no se pudo guardar');
					$this->redirect(array('action'=>'index'));
				}
			}else{
				$this->Session->setFlash('El nombre de usuario es invalido');
				//$this->redirect(array('action'=>'index'));				
			}
		}	
		$parentMensajes = $this->Mensaje->find('list'); 
		
	}

	function existeUsuarioNombre($nombre = null){
		$users = ClassRegistry::init('User')->find('first', array(
					'conditions' => array(
						'User.username ' => $nombre
					),
					'fields' => array('User.user')
		));
	    
		return $users['User']['user'];
	}
	//no se usa
	/*function edit($id = null) {
		
		if(!$this->Auth->user()){
                        $this->Session->setFlash(__('Para responder mensajes privados es necesario loguearse', true));
                        $this->redirect(array('controller' =>'mensajes','action'=>'index'));
                }
		
		if (!$id && empty($this->data)) {
			$this->flash(__('Invalid Mensaje', true), array('action'=>'index'));
		}
		if (!empty($this->data)) {
			$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
			$this->data['Mensaje']['carpeta'] = 'E';
			
			if ($this->Mensaje->save($this->data)) {
				$this->flash(__('The Mensaje has been saved.', true), array('action'=>'index'));
			} else {
			}
		}
		if (empty($this->data)) {
			$this->data = $this->Mensaje->read(null, $id);
			$this->data['Mensaje']['destino'] = $this->data['Mensaje']['fuente'];
			$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
			
			$user = ClassRegistry::init('User')->find('first', array(
						'conditions' => array(
							'User.user ' => $this->data['Mensaje']['destino']
						)
			));
			//$parentMensajes = $this->Mensaje->ParentMensaje->find('list');
			//print_r($user['User']['username']);
			
			$this->set('user', $user['User']['username']);
		
		}
	
		

		//$parentMensajes = $this->Mensaje->ParentMensaje->find('list');
		//$this->set('user', $user['User']['username']);
	}*/
	
	/*Aqui respondemos un mensaje del buzon de entrada*/
	function responder($id = null) {
		
		if(!$this->Auth->user()){
                        $this->Session->setFlash(__('Para responder mensajes privados es necesario loguearse', true));
                        $this->redirect(array('controller' =>'mensajes','action'=>'index'));
                }
		
		if (!$id && empty($this->data)) {
			$this->flash(__('Invalid Mensaje', true), array('action'=>'index'));
		}
		
		if (!empty($this->data)) {
			$idDestino =  $this->existeUsuarioNombre( $this->data['Mensaje']['destino']);
			
			if($idDestino){
				$this->data['Mensaje']['fuente'] = $this->Auth->user('user');
				$this->data['Mensaje']['carpeta'] = 'E';
				$this->data['Mensaje']['destino'] = $idDestino;
				
				$this->Mensaje->create();
				if ($this->Mensaje->save($this->data)) {
					$this->redirect(array('action'=>'index'));
				}else {
					$this->Session->setFlash('El mensaje no se pudo guardar');
					//$this->redirect(array('action'=>'index'));
				}
			}else{
				$this->Session->setFlash('El nombre de usuario es invalido');
				//$this->redirect(array('action'=>'index'));				
			}
		}
		if (empty($this->data)) {
			$mensajeResponder = $this->Mensaje->read(null, $id);
			$this->data['Mensaje']['texto'] = $mensajeResponder['Mensaje']['texto'];
		}

		$user = ClassRegistry::init('User')->find('first', array(
					'conditions' => array(
						//'User.user ' => $this->data['Mensaje']['destino']
						'User.user ' => $mensajeResponder['Mensaje']['fuente']
					)
		));
		
		$this->set('user', $user['User']['username']);
		
	}
	
	/*Borra los mensajes que estan en la carpeta de borrados(estos ya no se pueden recuperar)*/
	function borrarIrremediablemente($id = null){
		
		if($this->data['Mensaje']){
			foreach($this->data['Mensaje'] as $value) {  
				if($value != 0) {
					$mensaje = $this->Mensaje->find('first', array(
						'conditions' => array(
							'Mensaje.mensaje_id ' => $value
						)));
					
					if($mensaje['Mensaje']['tipo'] != 2)
						$this->Mensaje->del($value);
					else{
						//Los mensajes de invitacion borrados irremediablemente lo mantenemos oculto
						//para poder chequear luego si el usuario fue o no realmente invitado a la sala					
						$this->Mensaje->id = $value;
						$this->Mensaje->saveField('tipo', '6');
					}
				}
			}  
		}
		if (!$id) {
			$this->flash(__('Invalid Mensaje', true), array('action'=>'index'));
		}else{
			$mensaje = null;
			$mensaje = $this->Mensaje->find('first', array(
						'conditions' => array(
							'Mensaje.mensaje_id ' => $id
						)));

			if($mensaje){
				if($mensaje['Mensaje']['tipo'] != 2){
					if ($this->Mensaje->del($id)) {
						$this->redirect(array('action'=>'index'));
					}else{
						$this->flash(__('No se pudo borrar el mensaje', true), array('action'=>'index'));
					}
				}else{
					//Los mensajes de invitacion borrados irremediablemente lo mantenemos oculto
					$this->Mensaje->id = $id;
					$this->Mensaje->saveField('tipo', '6');
				}
			}
			
		}
		$this->redirect(array('action'=>'index'));
	}
	
	function enviarBorrados($id = null) {

		foreach($this->data['Mensaje'] as $value) {
			if($value != 0) {
				$this->Mensaje->id = $value;
				if (!$this->Mensaje->saveField('carpeta', 'B'))
					$this->Session->setFlash('El mensaje no se pudo guardar');
			}
		}
		
		if (!$id) {
			$this->flash(__('Invalid Mensaje', true), array('action'=>'index'));
		}else{
			$this->Mensaje->id = $id;
			if (!$this->Mensaje->saveField('carpeta', 'B'))
				$this->Session->setFlash('El mensaje no se pudo guardar');		
		}
		$this->redirect(array('action'=>'index'));
		
	}
	
        function getNombresUsers(){
            $users = ClassRegistry::init('User')->find('all');

            $id_x_user = null;
            foreach($users as $user){
                $id_x_user[$user['User']['user']] = $user['User']['username'];
            }
        
            return array( $id_x_user );
        }
	
	function autoComplete() {
		
		$users = ClassRegistry::init('User')->find('all', array(
					'conditions' => array(
						'User.username LIKE' => $this->data['Mensajes']['destino'].'%'
					),
					'fields' => array('username')
		));
		
		$this->set('users', $users);
		$this->layout = 'ajax';
		
	}
	
}
?>